package com.study.newjava8.lambda;

import com.study.newjava8.pojo.Employee;

import java.util.*;
import java.util.stream.Collectors;

/**
 * 匿名内部类的转换
 * @author huangsm
 * @version V1.0
 */
public class LambdaTest1 {
    public static void main(String[] args) {
        //使用匿名内部类比较俩个Integer大小
        Comparator<Integer> comparator=new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return Integer.compare(o1,o2);
            }
        };

        //使用匿名内部类
        TreeSet<Integer> ts=new TreeSet<>(comparator);

        //使用lambda表达式解决匿名内部类
        Comparator<Integer> com = (a, b) -> Integer.compare(a, b);


        List<Employee> employees= Arrays.asList(
                new Employee("huangsm",22,40020.0),
                new Employee("huangsm1",24,52300.0),
                new Employee("huangsm2",26,40100.0),
                new Employee("huangsm3",21,42300.0)
        );
        //需求:获取当前公司中员工年龄大于25的员工信息（优化方式1.策略模式优化方式这里就不实现了，直接使用匿名内部类的方式优化）

        /**
         * 优化方法2，匿名内部类
         */

        List<Employee> employees1 = filterEmployees(employees, new MyPredicat<Employee>() {
            @Override
            public boolean test(Employee employee) {
                return employee.getAge() > 25;
            }
        });
        /**
         * 使用lambda表达式优化
         */
        List<Employee> employees2 = filterEmployees(employees, (e)->e.getAge()>25);
        employees2.forEach(System.out::println);

        /***
         * stream方式操作 得到员工名第一个年龄小于25
         */
        List<String> names = employees.stream().
                filter((e) -> e.getAge() < 25).
                limit(1).
                map(Employee::getName).
                collect(Collectors.toList());
        names.forEach(System.out::println);
    }

    /**
     * 过滤方法
     * @param employees
     * @param myPredicat
     * @return
     */
    public static List<Employee> filterEmployees(List<Employee> employees,MyPredicat<Employee> myPredicat){
        List<Employee> emps=new ArrayList<>();
        employees.forEach(e->{
            if (myPredicat.test(e)){
                emps.add(e);
            }
        });
        return emps;
    }
}
